﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json;
using System.Runtime.Serialization;

namespace mrp16062010.Rota
{
    [Serializable()]
    class Operasyon : AbstractRota, ISerializable
    {
        public static int SonKod = 0;
        public enum Tur
        {
            Montaj, Imalat
        }

        private Tur turu;

        public Tur Turu
        {
            get { return turu; }
            set { turu = value; }
        }
        

        public Operasyon(int Kod, string adi,TimeSpan Sure, TimeSpan HazirlikSuresi, IsMerkezi IsMerkeziRota)
        {
            ad= adi;
            sure = Sure;
            hazirlikSuresi = HazirlikSuresi;
            isMerkeziRota = IsMerkeziRota;
            kod = Kod;
        }
        private int sira;
       
        public int Sira
        {
            get { return sira; }
            set { sira = value; }
        }

        private int kod;

        public int Kod
        {
            get { return kod; }
            set { kod = value; }
        }

        private string ad;

        public string Ad
        {
            get { return ad; }
            set { ad = value; }
        }

       private TimeSpan sure;

        public TimeSpan Sure
        {
            get { return sure; }
            set { sure = value; }
        }
        

        private mrp16062010.IsMerkezi isMerkeziRota;

        public mrp16062010.IsMerkezi IsMerkeziRota
        {
            get { return isMerkeziRota; }
            set { isMerkeziRota = value; }
        }

        private TimeSpan hazirlikSuresi;

        public TimeSpan HazirlikSuresi
        {
            get { return hazirlikSuresi; }
            set { hazirlikSuresi = value; }
        }

        private List<Stok> girenStokList= new List<Stok>();

        public List<Stok> GirenStokList
        {
            get
            {

                foreach (Rota.Operasyon operasyon in AltindakiOpList)
                {
                    foreach (Rota.RotaParcasi rp in operasyon.AltParca)
                    {
                        girenStokList.Add(rp.Stok);
                    }
                }
                return girenStokList;
            }
        }

        public List<Rota.Operasyon> AltindakiOpList{
            get
            {
                return (from x in this.Rota.OperasyonList
                        where x.Sira < this.Sira
                        orderby x.Sira descending
                        select x).ToList<Rota.Operasyon>();
            }
        }

        public List<Rota.Operasyon> UstundekiOpList
        {
            get
            {
                return (from x in this.Rota.OperasyonList
                        where x.Sira > this.Sira
                        orderby x.Sira ascending
                        select x).ToList<Rota.Operasyon>();
            }
        }

        private Stok olusanStok;

        public Stok OlusanStok
        {
            get { return this.Rota.Stok; }
        }
         
        

        private List<RotaParcasi> altParca = new List<RotaParcasi>();

        public List<RotaParcasi> AltParca
        {
            get { return altParca; }
            set { altParca = value; }
        }

        public void RotaParcasiEkle(RotaParcasi gelen)
        {
            gelen.Ust = this;
            altParca.Add(gelen);
            /*
            //##
            //Adetleri hesaplar
            gelen.ToplamUretilecekAdet = this.Rota.ToplamUretilecekAdet * gelen.Adet;
            //##
            */
        }

        //public TimeSpan Uzunluk()
        //{
        //    TimeSpan toplam = new TimeSpan();
        //    for (int i = this.Sira; i < 0; i--)
        //    {
        //        toplam+=(TimeSpan.FromTicks(this.Rota.OperasyonList[i].Sure.Ticks * this.Rota.ToplamUretilecekAdet()));
        //        toplam+=(this.Rota.OperasyonList[i].HazirlikSuresi);
        //    }
        //    if (this.Rota.Ust != null)
        //    {
        //        toplam+=(this.Rota.Ust.Uzunluk());
        //    }
        //    return toplam;
        //}

        private bool SonDalMi()
        {
            if (AltindakiOpList.Count > 0)
            {
                return false;
            }
            if (altParca.Count == 0)
            {
                return true;
            }
            
            return false;
        }
        //Bu operasyon hariç altındaki tüm operasyonlar için en uzun olan daldaki rotaparçasını döndürür
        //public Rota.RotaParcasi EnUzunDal()
        //{
        //    List<Rota.Operasyon> alltakiOp = (from x in this.Rota.OperasyonList
        //                     where x.Sira > this.Sira
        //                     orderby x.Sira descending
        //                     select x).ToList<Rota.Operasyon>();
        //    List<Rota.RotaParcasi> sonDallar = new List<RotaParcasi>();

        //    foreach (Rota.Operasyon op in this.Rota.OperasyonList)
        //    {
        //        foreach (Rota.RotaParcasi rp in op.AltParca)
        //        {
        //            sonDallar.Add(rp.EnUzunDal());
        //        }
        //    }

        //    sonDallar = (from x in sonDallar
        //                 orderby x.Uzunluk(this)
        //                 select x).ToList<Rota.RotaParcasi>();
        //    return sonDallar.First<Rota.RotaParcasi>();
        //}

        public Operasyon UstundekiOperasyon
        {
            get { return ustundekiOperasyon(); }
        }

        private Operasyon ustundekiOperasyon()
        {
            if (UstundekiOpList.Count == 0)
            {
                return null;
            }
            return UstundekiOpList.First();
        }

        public Operasyon AltindakiOperasyon
        {
            get { return altindakiOperasyon(); }
        }

        private Operasyon altindakiOperasyon()
        {
            if (AltindakiOpList.Count == 0)
            {
                return null;
            }
            return AltindakiOpList.First();
        }

        public Operasyon(SerializationInfo info, StreamingContext context):base(info, context)
        {
            Serialize.InfoCopier.Read(info, this);
            this.Rota = (RotaParcasi)info.GetValue("Rota", typeof(RotaParcasi));
            //this.Tanim = (string)info.GetValue("Tanim", typeof(string));
        }

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            //base.GetObjectData(info, context);
            
            info = Serialize.InfoCopier.Write(info, this);
            info.AddValue("Rota", this.Rota);
            //info.AddValue("Tanim", this.Tanim);
        }

        [NonSerialized]
        private List<SiralamaBilgileri> siralamaTablosu;

        public List<SiralamaBilgileri> SiralamaTablosu
        {
            get { return siralamaTablosu; }
            set { siralamaTablosu = value; }
        }
        
        /*public List<Operasyon> */
    }
}
